#include<iostream>

using namespace std;
const int N=110;
int f[N][N];
int a[N];
int n,m;
const int Mod=1e6+7;
int main()
{
	cin>>n>>m; 
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	 } 
	 f[0][0]=1;
	 //完全背包
	 for(int i=1;i<=n;i++)//从前i种选择 
	 {
	 	for(int j=m;j>=0;j--)//不要超过j盆 
	 	{
			 //选
			 for(int k=0;k<=a[i]&&k<=j;k++)//k==0就是不选的情况 
			 {
			 	f[i][j]=(f[i][j]+f[i-1][j-k])%Mod;//注意是j-k而且循环的时候是k<a[i] 
			 }
		 }
	 }
	 //空间优化
	 //空间优化一定要从1开始遍历，因为k=0的情况如果算进去了就相当于把不选的这种情况乘2了
	 //实际上我们f[i]本来就存放着什么也不选这种情况的方案数呢 
//	  for(int i=1;i<=n;i++)//从前i种选择 
//	 {
//	 	for(int j=m;j>=0;j--)//不要超过j盆 
//	 	{
//			 //选
//			 for(int k=1;k<=a[i]&&k<=j;k++)//k==0就是不选的情况 
//			 {
//			 	f[j]=(f[j]+[j-k])%Mod;//注意是j-k而且循环的时候是k<a[i] 
//			 }
//		 }
//	 }
	 cout<<f[n][m]<<endl;
	return 0;
 } 